package dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import modelo.Combobebidaxpresupuesto;
import modelo.Combobebidaxsalon;
import modelo.Importepresupuesto;
import modelo.Interesado;
import modelo.Menuxpresupuesto;
import modelo.Presupuesto;
import modelo.Salon;
import modelo.Servicioadicionalxpresupuesto;
import modelo.Servicioadicionalxsalon;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

import util.HibernateUtil;

public class PresupuestoDao implements Serializable {

	private static final long serialVersionUID = 1L;

	private Session session;
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

	public void guardarPresupuesto() {

	}

	public Integer guardarPresup(Presupuesto presupuesto,
			Interesado interesadoSelected,
			List<Menuxpresupuesto> listMenuSeleccionados,
			List<Combobebidaxsalon> listComboBebidaXSalonSeleccionadas,
			List<Servicioadicionalxsalon> listServicioXSalonSeleccionadas,
			List<Importepresupuesto> listImporteFijoSeleccionados) {

		session = sessionFactory.openSession();

		try {
			session.beginTransaction();
			presupuesto.setInteresado(interesadoSelected);
			session.save(presupuesto);

			Long id = ((BigInteger) session.createSQLQuery(
					"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
			int idPresupuesto = new BigDecimal(id).intValueExact();

			// guardo los Menuxpresupuesto por salon a mano
			Query queryMxp = session
					.createSQLQuery("INSERT INTO menuxpresupuesto (idPresupuesto, idMenu, cantidad, descripcion) VALUES (:valor1, :valor2, :valor3, :valor4)");

			Iterator<Menuxpresupuesto> it = listMenuSeleccionados.iterator();
			while (it.hasNext()) {
				Menuxpresupuesto mp = (Menuxpresupuesto) it.next();
				queryMxp.setParameter("valor1", idPresupuesto);
				queryMxp.setParameter("valor2", mp.getMenu().getIdMenu());
				queryMxp.setParameter("valor3", mp.getCantidad());
				queryMxp.setParameter("valor4", mp.getDescripcion());
				queryMxp.executeUpdate();

			}

			// guardo los combobebidaxpresupuesto a mano
			Query queryCbs = session
					.createSQLQuery("INSERT INTO combobebidaxpresupuesto (idPresupuesto, idSalon, idComboBebida) VALUES (:valor1, :valor2, :valor3)");

			Iterator<Combobebidaxsalon> it1 = listComboBebidaXSalonSeleccionadas
					.iterator();
			while (it1.hasNext()) {
				Combobebidaxsalon cb = (Combobebidaxsalon) it1.next();
				queryCbs.setParameter("valor1", idPresupuesto);
				queryCbs.setParameter("valor2", presupuesto.getSalon()
						.getIdSalon());
				queryCbs.setParameter("valor3", cb.getCombobebida().getIdComboBebida());
				queryCbs.executeUpdate();

			}

			// guardo los servicioadicionalxpresupuesto a mano
			Query querySxp = session
					.createSQLQuery("INSERT INTO servicioadicionalxpresupuesto (idPresupuesto, idServicioAdicional, descripcionServicioPresupuesto)"
							+ " VALUES (:valor1, :valor2, :valor3)");

			Iterator<Servicioadicionalxsalon> it2 = listServicioXSalonSeleccionadas
					.iterator();
			while (it2.hasNext()) {
				Servicioadicionalxsalon sap = (Servicioadicionalxsalon) it2
						.next();
				querySxp.setParameter("valor1", idPresupuesto);
				querySxp.setParameter("valor2", sap.getServicioadicional()
						.getIdServicio());
				querySxp.setParameter("valor3", "");
				querySxp.executeUpdate();

			}

			// guardo los servicioadicionalxpresupuesto a mano
			Query queryIxp = session
					.createSQLQuery("INSERT INTO importepresupuesto (idTipoImporteFijo, idPresupuesto, importe)"
							+ " VALUES (:valor1, :valor2, :valor3)");

			Iterator<Importepresupuesto> it3 = listImporteFijoSeleccionados
					.iterator();
			while (it3.hasNext()) {
				Importepresupuesto ixp = (Importepresupuesto) it3.next();
				queryIxp.setParameter("valor1", ixp.getTipoimportefijo()
						.getIdTipoImporteFijo());
				queryIxp.setParameter("valor2", idPresupuesto);
				queryIxp.setParameter("valor3", ixp.getImporte());
				queryIxp.executeUpdate();

			}

			session.getTransaction().commit();
			return idPresupuesto;
		} catch (Exception e) {
			System.out.print(e.getMessage());
			session.getTransaction().rollback();
			return null;
		}

	}

	public List<Presupuesto> obtenerPresupuestos() {
		session=sessionFactory.openSession();

		Criteria cr = session.createCriteria(Presupuesto.class);
//		         .add(Restrictions.eq("estadopresupuesto.idEstadoPresupuesto", 1));
		List<Presupuesto> results = cr.list();
		
		session.close();
		
		return results;
	}

	public List<Presupuesto> obtenerPresupuestosPendientes() {
        FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
        HttpSession sessionActual = (HttpSession) context.getExternalContext().getSession(false);
        Integer nB = null;
        
        if (sessionActual!= null)
        {  nB = Integer.parseInt(sessionActual.getAttribute("persona").toString());             }
        else
        {
        	nB=3;
        	
        }
		
		session=sessionFactory.openSession();

		Criteria cr = session.createCriteria(Presupuesto.class)
				 .createAlias("salon.persona", "persona")
				 .setFetchMode("persona", FetchMode.JOIN)
		         .add(Restrictions.eq("estadopresupuesto.idEstadoPresupuesto", 1))
		         .add(Restrictions.eq("persona.idPersona", nB));
		List<Presupuesto> results = cr.list();
		
		session.close();
		
		return results;
	}	
	
	public Presupuesto getPresupuestoSeleccionado(int p) {
		session=sessionFactory.openSession();
		try{
			
		Criteria cr = session.createCriteria(Presupuesto.class)
				.setFetchMode("salon", FetchMode.JOIN)
		.add(Restrictions.eq("idPresupuesto", p));
		Presupuesto results = (Presupuesto) cr.list().get(0);
		
		session.close();
		
		return results;
		}
		catch(Exception e){
			return null;
		}
	}

	public List<Menuxpresupuesto> getListaMenuxpresup(int i) {
		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Menuxpresupuesto.class)
				.add(Restrictions.eq("presupuesto.idPresupuesto", i));
		
		List<Menuxpresupuesto> results = cr.list();
		
		session.close();
		
		return results;
		
	}

	public List<Combobebidaxpresupuesto> getListaComboBebidaxPresupuesto(int i) {
		
		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Combobebidaxpresupuesto.class)
				.setFetchMode("combobebida", FetchMode.JOIN)
				.add(Restrictions.eq("presupuesto.idPresupuesto", i));
		
		List<Combobebidaxpresupuesto> results = cr.list();
		
		session.close();
		
		return results;
	}

	public Combobebidaxsalon getComboBebidaxSalon(Combobebidaxpresupuesto m) {

		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Combobebidaxsalon.class)
				.add(Restrictions.eq("combobebida.idComboBebida", m.getCombobebida().getIdComboBebida()))
				.add(Restrictions.eq("salon.idSalon", m.getSalon().getIdSalon()));
		
		Combobebidaxsalon results = (Combobebidaxsalon) cr.list().get(0);
		
		session.close();
		
		return results;
		
	}

	public List<Servicioadicionalxpresupuesto> getListaServiciosxPresupuesto(
			int i) {

		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Servicioadicionalxpresupuesto.class)
				.add(Restrictions.eq("presupuesto.idPresupuesto", i));
		
		List<Servicioadicionalxpresupuesto> results = cr.list();
		
		session.close();
		
		return results;
	}

	public Servicioadicionalxsalon getServicioAdicionalxSalon(
			Servicioadicionalxpresupuesto m, int idPresupuesto) {
		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Servicioadicionalxsalon.class)
				.add(Restrictions.eq("servicioadicional.idServicio", m.getServicioadicional().getIdServicio()))
		.add(Restrictions.eq("salon.idSalon", idPresupuesto));
		
		Servicioadicionalxsalon results = (Servicioadicionalxsalon) cr.list().get(0);
		
		session.close();
		
		return results;
	}

	public List<Importepresupuesto> getImportePresupuesto(int i) {
		session=sessionFactory.openSession();
		
		Criteria cr = session.createCriteria(Importepresupuesto.class)
				.setFetchMode("tipoimportefijo", FetchMode.JOIN)
				.add(Restrictions.eq("presupuesto.idPresupuesto", i));
		
		List<Importepresupuesto> results = cr.list();
		
		session.close();
		
		return results;
	}

	public Presupuesto obtenerPresupuesto(Integer presuSel) {
        session = sessionFactory.openSession();
        
        Criteria cr = session.createCriteria(Presupuesto.class)
                                .add(Restrictions.eq("idPresupuesto", presuSel));
//      .setFetchMode("servicioadicionalxsalons", FetchMode.JOIN);
        
        List<Presupuesto>results = cr.list();
        session.close();		
		
		return results.get(0);
	}



	
}
